package com.itheima.d2_reflect;

import org.junit.Test;

import java.lang.reflect.Field;

/*
     目标：掌握获取类的成员变量，并对其进行操作。

     Class类中方法
        public Field[] getFields()	获取类的全部成员变量（只能获取public修饰的）
        public Field[] getDeclaredFields()	获取类的全部成员变量（只要存在就能拿到）
        public Field getField(String name)	获取类的某个成员变量（只能获取public修饰的）
        public Field getDeclaredField(String name)	获取类的某个成员变量（只要存在就能拿到）
    Field类中的方法
        void set(Object obj, Object value)：	赋值
        Object get(Object obj)	取值
        public void  setAccessible(boolean flag)	设置为true，表示禁止检查访问控制（暴力反射）

   需求 : 操作猫类的成员变量
 */
public class Test3Field {
    @Test
    public void testGetFields() throws Exception {
        Class c1 = Cat.class;
        Field[] fields = c1.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("===================");
        Field fields1 = c1.getField("a");
        System.out.println(fields1);
        fields1.set(null,100);
        System.out.println(fields1.get(null));
        System.out.println("===================");
        Object o = c1.newInstance();
        Field name = c1.getDeclaredField("name");
        name.setAccessible(true);
        name.set(o,"加菲猫");
        System.out.println(name.get(o));
    }
}
